// pages/song/song.js
import request from '../../utils/request'
import moment from 'moment'

import PubSub from 'pubsub-js'

// 获取全局的唯一小程序实例
var appInstance = getApp()
// console.log(appInstance)

Page({

  /**
   * 页面的初始数据
   */
  data: {
    isPlay: false,//控制动画播放暂停
    musicId: '',//音乐的id值
    music: {},//音乐详情信息列表
    durationTime: '00:00',//总时间
    currentTime: '00:00',//当前时间
    musicLink: '',//播放地址
    currentWith: '',//进度条
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    //存储路由传参的音乐id
    const musicId = options.songId
    // console.log(musicId)
    // 更新音乐的id数据
    this.setData({
      musicId
    })

    // 根据id获取详情数据信息
    this.getMusic(this.data.musicId)

    // 设置播放音乐地址  进行播放
    this.bgAudioManager = wx.getBackgroundAudioManager();

    // 判断全局的实例对象中的播放状态是否为true
    if (appInstance.globalData.playStatus && appInstance.globalData.musicId.toString() === this.data.musicId.toString()) {
      this.setData({
        isPlay: true
      })
    }

    // 监听背景音频播放
    this.bgAudioManager.onPlay(() => {
      this.changeMusicStatus(true)

      //音乐的id标识
      appInstance.globalData.musicId = this.data.musicId
    })

    //监听背景音频暂停
    this.bgAudioManager.onPause(() => {
      this.changeMusicStatus(false)
    })

    // 监听背景音频停止事件
    this.bgAudioManager.onStop(() => {
      this.changeMusicStatus(false)
    })

    //监听背景音乐播放进度更新
    this.bgAudioManager.onTimeUpdate(() => {
      //更新播放时间
      const currentTime = moment(this.bgAudioManager.currentTime * 1000).format('mm:ss')

      // 当前的进度 = 当前的播放时间 * 总的进度 / 总的时间
      const currentWith = this.bgAudioManager.currentTime * 450 / this.bgAudioManager.duration

      //更新
      this.setData({
        currentTime,
        currentWith
      })
    })

    // 监听背景音乐自然播放结束
    this.bgAudioManager.onEnded(() => {
      this.setData({
        currentTime: '00:00',
        currentWith: 0
      })

      // 自动播放下一首歌
      this.handlerSwitch({
        currentTarget: {
          id: 'next'
        }
      })
    })

  },

  // 进行封装
  changeMusicStatus(isPlay) {
    this.setData({
      isPlay
    })

    // 播放状态
    appInstance.globalData.playStatus = isPlay
  },

  // 获取音乐详情数据信息
  async getMusic(ids) {
    const result = await request('/song/detail', { ids })
    // console.log(result)
    // 存储数据
    const music = result.songs[0]

    // 存储总时间
    const durationTime = moment(music.dt).format('mm:ss')

    // 更新数据
    this.setData({
      music,
      durationTime
    })

    wx.setNavigationBarTitle({
      title: this.data.music.name
    })
  },

  // 控制音乐播放暂停
  handlerPlay() {
    const isPlay = !this.data.isPlay

    // 更新数据
    this.setData({
      isPlay
    })

    // 去除音乐id与播放地址
    const { musicId, musicLink } = this.data
    // 播放 暂停音乐  传入播放的状态 id  地址
    this.musicControl(isPlay, musicId, musicLink)
  },


  // 播放  暂停音乐
  async musicControl(isPlay, musicId, musicLink) {
    // 音乐id
    if (!isPlay) {
      // 暂停
      this.bgAudioManager.pause()
      return
    }

    // 判断播放地址是否存在
    if (!musicLink) {
      // 获取播放地址
      const result = await request('/song/url', { id: musicId })

      // 存储获取到的播放地址
      musicLink = result.data[0].url

      // 更新
      this.setData({
        musicLink
      })

      // 再次判断音乐地址是否存在
      if (!musicLink) {
        wx.showToast({
          title: '请充钱',
          icon: 'none',
        });
        return
      }

      // 设置地址
      this.bgAudioManager.src = musicLink
      // 设置标题
      this.bgAudioManager.title = this.data.music.name

    }
  },


  // 播放上一首 下一首
  handlerSwitch(event) {
    // 消息订阅
    PubSub.subscribe('musicId', (msg, musicId) => {
      // console.log(musicId)

      // 存储id
      this.setData({
        musicId
      })

      // 根据id获取音乐详情
      this.getMusic(musicId)

      // 播放歌曲
      this.musicControl(true, musicId)

      //自杀
      PubSub.unsubscribe('musicId')
    })

    // 获取标识
    const type = event.currentTarget.id
    // 发布消息   向recommendSong页面传递标识数据
    PubSub.publish('switchType', type)
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})